package com.ruoyi.iot.domain.enums;

import com.ruoyi.common.utils.StringUtils;
import java.time.LocalDate;
import java.time.Month;
import java.time.ZoneId;
import java.time.ZonedDateTime;
import java.time.temporal.TemporalAdjusters;
import java.util.Locale;

/**
 * 设备统计时间范围枚举，支持本日、本月、本季度、本年度聚合。
 */
public enum DeviceTimeScope {
    /**
     * 本日
     */
    TODAY("today", "本日"),
    /**
     * 本月
     */
    MONTH("month", "本月"),
    /**
     * 本季度
     */
    QUARTER("quarter", "本季度"),
    /**
     * 本年度
     */
    YEAR("year", "本年度");

    private final String code;
    private final String description;

    DeviceTimeScope(String code, String description) {
        this.code = code;
        this.description = description;
    }

    public String getCode() {
        return code;
    }

    public String getDescription() {
        return description;
    }

    /**
     * 根据字符串解析时间范围，支持 today/month/quarter/year 或对应中文描述（大小写不敏感），为空时默认返回本月。
     *
     * @param text 前端传入的时间范围文本
     * @return 对应的时间范围枚举
     */
    public static DeviceTimeScope fromText(String text) {
        if (StringUtils.isBlank(text)) {
            return MONTH;
        }
        String normalized = text.trim();
        for (DeviceTimeScope scope : values()) {
            if (scope.code.equalsIgnoreCase(normalized) || scope.description.equals(normalized)) {
                return scope;
            }
        }
        String upper = normalized.toUpperCase(Locale.ROOT);
        try {
            return DeviceTimeScope.valueOf(upper);
        } catch (IllegalArgumentException ignored) {
            throw new IllegalArgumentException("时间范围仅支持本日、本月、本季度、本年度");
        }
    }

    /**
     * 根据当前系统日期计算统计区间的开始时间（含）。
     *
     * @return 以系统默认时区表示的区间开始时间
     */
    public ZonedDateTime rangeStart() {
        ZoneId zone = ZoneId.systemDefault();
        LocalDate today = LocalDate.now(zone);
        switch (this) {
            case TODAY:
                return today.atStartOfDay(zone);
            case MONTH:
                return today.withDayOfMonth(1).atStartOfDay(zone);
            case QUARTER:
                Month firstMonthOfQuarter = today.getMonth().firstMonthOfQuarter();
                LocalDate quarterStart = today.withMonth(firstMonthOfQuarter.getValue()).withDayOfMonth(1);
                return quarterStart.atStartOfDay(zone);
            case YEAR:
            default:
                return today.with(TemporalAdjusters.firstDayOfYear()).atStartOfDay(zone);
        }
    }
}
